Best Practices for Reproducible Research

Porque fazer pesquisa Reprodutível?

A reprodutibilidade é um termo muito debatido na ciência atualmente, afinal, a ciência por definição busca resultados de experimentos reproduzíveis. As pesquisas claramente avançam com mais rapidez quando os cientistas verificam e têm a possibilidade de observar os resultados uns dos outros, além de perderem menos tempo buscando pistas falsas.

Em 2013, iniciou-se o Reproducibility Project: Cancer Biology of the Center for Open Science, cujo objetivo é reproduzir 50 importantes estudos de câncer e analisar os resultados. Até o momento, os 5 primeiros trabalhos foram liberados, pelo menos uma vez em cada estudo analisado, um resultado alcançado não foi encontrado como o reportado. Em dois dos casos, as diferenças entre o estudo inicial e o replicado foi ainda mais impressionantes, dando motivo de preocupação para toda a comunidade científica.

Em 2015, foi realizado o Reproducibility Project: Psychology pelo Open Science Colaboration um projeto de verificação de reprodutibilidade de 100 estudos da área de psicologia, entre os estudos analisados apenas 39 foram replicados. O que nos indica que diferentes áreas do conhecimento possuem dificuldade em reproduzir seus próprios trabalhos.

Pesquisas Reprodutíveis têm ganhado espaço e muita importância na comunidade científica nos últimos anos. Os gráficos abaixo mostram o crescimento do termo Reproducible Research nos trabalhos publicados nos últimos 20 anos.

Em que momento devo tornar minha pesquisa Reprodutível?

Os pesquisadores geralmente começam a pensar em tornar seu trabalho reprodutível perto do final do processo de pesquisa, quando eles escrevem seus resultados ou quando precisam compartilhar a pesquisa com algum colega de laboratório. Até este ponto, podem haver várias versões do conjunto de dados e registros das análises armazenadas em diferentes repositórios. Tornando um trabalho difícil e demorado pesquisar e organizar todos os arquivos necessários para criar uma ordem precisa de como os resultados foram alcançados.

Esperar até o final do processo de pesquisa para começar a pensar sobre a reprodutibilidade geralmente resulta em uma documentação incompleta, sem uma descrição tão precisa de como foram feitas cada uma das descobertas. Portanto, é importante concentrar-se na reprodutibilidade desde o início do processo e continuar a seguir boas práticas de reprodutibilidade durante as atualizações do trabalho.

Pense no processo de reprodutibilidade desde a concepção da sua proposta de pesquisa e garanta que o trabalho seja facilmente reproduzido por qualquer outro pesquisador do mundo.

Mas como tornar minha pesquisa Reprodutível?

Lembre-se que uma pesquisa parcialmente reprodutível é melhor que uma pesquisa não reprodutível.

Na prática, nem todos os projetos são 100% reprodutíveis, mas permita que seu projeto seja o mais reprodutível que estiver ao seu alcance. A proposta de um trabalho reprodutível é oferecer a qualquer outro pesquisador, os dados originais do estudo, processados com os mesmos scripts e obter resultados idênticos ou muito próximos do original. Mas aqui vão algumas dicas de como começar e algumas boas estratégias.

Imagine sua pesquisa em 5 âmbitos:

- Workflow: Ofereça um overview do seu trabalho, ter uma visão de onde podemos chegar no final da jornada facilita ao observar cada parte do trabalho.
- Dados:
Sempre que possível devem ser disponibilizados, com informações como: origem, tamanho e possíveis normalizações utilizadas.
- Código:
Quando possível, disponibilize seus scripts, cuide para que eles sejam fácil de ser entendidos por humanos.
- Documentação:
Além do seu paper por escrito, ofereça informações sobre cada etapa do seu trabalho: como os dados se relacionam com os códigos? Como os gráficos do trabalho foram gerados? E como aqueles resultados foram alcançados?
- Ambiente:
Disponibilize informações do ambiente utilizado. A versão das bibliotecas e softwares utilizadas em sua pesquisa mudam ao longo do tempo e podem alterar o resultado final de reprodutibilidade.

Alguns projetos são mais complexos do que outros e consequentemente podem tornar o processo de reprodutibilidade mais desafiador. Muitas ferramentas e técnicas estão disponíveis para ajudar a superar esses desafios.

Abaixo descrevemos detalhadamente, passo a passo, uma série de boas práticas em cada uma das 5 etapas indicadas, note que a ordem dos passos são apenas uma sugestão, ficando a critério do leitor executar cada etapa de acordo com as necessidades de seu projeto.

Primeiro Passo: Workflow

Imagine iniciar um passeio numa estrada, iniciamos a caminhada mas ainda não sabemos exatamente onde vamos chegar; também não sabemos que dificuldades teremos pelo caminho, se teremos que atravessar um rio, um pântano ou uma montanha...Parece um pouco angustiante, não é mesmo?

Essa é exatamente a mesma sensação ao tentar reproduzir uma pesquisa sem um Workflow. A ideia do workflow é oferecer um "mapa" completo de toda sua pesquisa, indicando aos colegas todos os pontos mais importantes da jornada. Existem várias ferramentas que podem lhe auxiliar na criação do Workflow:

- Taverna: Taverna é um poderoso aplicativo de gerenciamento de workflow científico que ajuda a resolver o problema da complexidade excessiva em grandes projetos.
- Loni Pipeline:
É um sistema distribuído gratuito para projetar, executar, monitorar e compartilhar fluxos de trabalho científicos principalmente nas áreas de bioinformática, neuroimagem e genômica.
- Pegasus:
Gerenciador de workflows, muito utilizado nas áreas de astronomia, bioinformática, física e oceanografia.

IMPORTANTE: As ferramentas listadas acimas são indicadas em projetos específicos das áreas citadas ou projetos muito complexos, com muitos níveis de abstração. Caso seu trabalho não tenha tantas etapas utilize alguma ferramenta de edição de imagens ou de criação de fluxograma como:

- Draw IO: Ferramenta de criação de diagramas online, simples de usar e muito eficiente.
- Pixlr Editor:
Ferramenta de edição de imagens online, equivalente ao Photoshop, simples de usar para aqueles que já possuem familiaridade com este tipo de software.

Dicas

  1. É importante que todo projeto ofereça um Workflow, mas observe o tamanho do seu projeto e veja se realmente é necessário lidar com uma ferramenta de gerenciamento de workflow, para alguns casos apenas um diagrama ou fluxograma já oferece todas as informações necessárias.
  2. Indique no worflow as saídas e entradas de dados: Isso facilita que outros pesquisadores identifiquem o que acontece em cada etapa.
  3. Sempre que possível referencie as funções utilizadas em cada etapa do workflow, relacionando as funções dos códigos as etapas do projeto.
  4. Mantenha seu workflow sempre atualizado. Não adianta ter uma referência que não corresponda a realidade do projeto no momento.
  5. O Workflow não deve ser um fluxograma do código implementado. Os scripts são apenas uma parte do seu projeto, pense nas etapas do projeto de maneira macro.

Segundo Passo: Dados

Nem sempre os dados utilizados podem ser compartilhados publicamente. Dados médicos, genéticos entre outros tem este tipo de restrição, para todos que podem ser compartilhados as ferramentas de controle de versão podem ser utilizadas. Também existem alguns repositórios online específicos que podem ajudar nesta tarefa.

- Github:
- Bitbucket:

Dicas

  1. Se possível, disponibilize os dados. Estes podem ser de dois tipos: Dados Brutos ou Dados Normalizados, deixe explícito qual tipo de dado está sendo disponibilizado.
  2. Caso utilize dados normalizados inclua os dados brutos e scripts que chegaram aquele resultado, juntamente com as sementes do gerador de números randômicos, caso seja utilizada.Os dados e scripts podem ser disponibilizados num ambiente de controle de versão.
  3. Deixe o computador fazer o trabalho difícil: Caso precise realizar alguma tarefa repetitiva como numa base de dados de imagem cortá-las no mesmo tamanho específico, automatize esta tarefa. Isso garante dados mais consistentes e evita dados com erros ou fora do padrão especificado.
  4. Informe as decisões do projeto: Alguns dados foram removidos da amostra utilizada?Além de disponibilizar os scripts que alteram a amostra, indique o motivo de utilizar aquele tipo de normalização. Através dessa informação outros pesquisadores podem ter visões diferentes do seu trabalho e até gerarem novas propostas.
  5. Quando possível, ofereça a informação da procedência dos dados. Afinal de contas, não queremos fazer pesquisa com dados não confiáveis. Informar a origem dos seus dados dá mais transparência e confiança em seu projeto.

Terceiro Passo: Código

Ao longo do desenvolvimento do projeto, os scripts vão evoluindo, recebendo alterações e correções de erros, utilizar ferramentas de controle de versão dá mais tranquilidade e facilita a organização do trabalho em equipe. Além disso em códigos de computador é muito comum fazer uma alteração trivial e todo o código se comportar de maneira inesperada, por isso é relevante ter a possibilidade de voltar a versões anteriores.


Você pode armazenar seu código utilizando alguma das ferramentas abaixo:

Os códigos podem ser armazenados em vários repositórios

- Github: Ferramenta de controle de versão mais comumente utilizada. Permite compartilhar projetos com visibilidade pública de maneira gratuita e oferece uma versão paga com controle privado de acesso ao código. Veja aqui um guia prático de uso do Github.
- Bitbucket: Veja aqui um guia prático de uso do Bitbucket

Dicas

  1. Escreva seu código para pessoas, não para computadores: Um programa de computador por mais complexo que seja, não deve ser difícil de ser entendido, utilize nomes realmente significativos em suas variáveis,classes e funções, evite utilizar nomes como aux, x1 ou valor, pois não transmitem significado ao leitor do código.

  2. Faça mudanças incrementais: A cada nova versão documente as alterações e utilize uma ferramenta de controle de versão para garantir a rastreabilidade do seu código. Faça pequenas alterações no código e registre cada uma com máximo de informações possíveis na descrição.

  3. Evite Repetições: Sempre que possível divida seu código em funções específicas que façam apenas uma tarefa, desta forma seu código fica modularizado e eficiente.Caso precise realizar aquela função novamente basta chamar a função já criada, isto evita repetições desnecessárias e melhora a qualidade do seu código.

  4. Tenho um arquivo Readme associado a seu projeto: Mesmo que você tenha organizado as pastas, os dados e todas as informações da melhor maneira possível. Ofereça no arquivo Readme uma documentação com uma visão geral do projeto além de dar informações sobre cada pasta. Não se esqueça de manter seu arquivo Readme atualizado a medida que o projeto vai sendo modificado.

  5. Cuide da organização dos arquivos e diretórios. Como sugestão as pastas podem ser organizados da seguinte maneira:

    • data: Armazena os dados utilizados no projeto.
    • dev: Armazena os scripts e funções do projeto.
    • figures: Armazena as imagens utilizadas para ilustrar o projeto.
    • Readme: Exibe uma visão geral do projeto.
  6. A cada commit faça um comentário da alteração realizada. Dessa forma todos que consultarem seu repositório terão uma pista da alteração realizada naquele ponto.

Quarto Passo: Documentação

Existem ferramentas de Literate Computing, extremamente eficientes, pois permitem unir código e texto. Assim cada funcionalidade pode ser explicada detalhadamente. Também pode ser gerados gráficos "vivos" gerados em tempo real dentro da ferramenta, os parâmetros para a geração do gráfico podem ser alterados e visualizados em tempo real. A ferramenta de Literate Computing mais utilizada atualmente é o Jupyter Notebook.

Jupyter Notebook

Utilizando o Jupyter Notebook é possível descrever a questão da pesquisa, a abordagem do projeto, narrar as etapas importantes na análise. Sempre mesclando explicações e o código de programação. Esses documentos podem ser construídos de forma dinâmica, escrevendo porções do código da narrativa e do software, visualizando os resultados no relatório e continuando a análise com narração e código adicionais ou resumindo os resultados.

Um documento completo de programação alfabetizada contém todos os componentes críticos de uma análise reprodutível: a descrição da análise, o código de programação usado para realizá-lo, os resultados e uma discussão.

Exemplo de gráficos vivos gerados no Jupyter Notebook

Veja abaixo um exemplo interessante de gráficos gerados em tempo real. Brinque com os dados insira e remova-os e observe o resultado.


In [10]:
import matplotlib.pyplot as plt
%matplotlib inline

data = [1, 2, 5, 10, 12, 15]
plt.figure()
plt.plot(data)


Out[10]:
[<matplotlib.lines.Line2D at 0x85fe6d8>]

Dicas

  1. Crie um novo notebook para cada versão importante de seu projeto. Assim é possível entender a evolução do projeto como um todo.
  2. Tenha atenção ao criar nomes para seus notebooks. Utilize algum tipo de padrão como a data + mês + ano + nome do notebook. Evite utilizar v01,v02,v03, pois estes nomes não transmitem nenhuma informação sobre o conteúdo ou alteração do notebook.
  3. Faça da documentação do projeto uma rotina: É muito fácil escrever texto e código com o Jupyter Notebook, tenha disciplina e documente todas as alterações de seu projeto como um hábito.
  4. Prefira utilizar gráficos vivos ou seja gerados através de código no Jupyter Notebook do que imagens de gráficos estáticas.
  5. A integração Jupyter Notebook e plataforma Latex ainda não funciona da melhor maneira. Não utilize este tipo de exportação de arquivos texto.

Quinto Passo: Ambiente

Um dos grandes desafios em pesquisa reprodutível é de oferecer todas as dependências necessárias de maneira simples e prática.O processo de identificação, instalação e configuração dessas dependências consome uma quantidade considerável de tempo dos cientistas. Diferentes sistemas operacionais e suas versões podem exigir diferentes etapas de instalação e configuração. Além disso, as versões anteriores das dependências de software, que podem ser instaladas atualmente em um determinado computador, podem ser incompatíveis ou produzir saídas diferentes das versões mais novas.

Existem algumas propostas no mercado que visam solucionar este problema:

- Máquinas Virtuais: Podem encapsular todo um sistema operacional e todos os softwares, scripts, códigos e dados necessários para executar uma análise computacional. Usando o software de virtualização, como VirtualBox ou VMWare, uma máquina virtual pode ser executada praticamente em qualquer desktop, laptop ou servidor, independentemente do sistema operacional principal do computador. Entretanto as máquinas virtuais na maioria dos casos são arquivos muito grandes e difíceis de serem compartilhados.
- Docker: Usa os recursos de isolamento de recursos do kernel do Linux para fornecer um conceito de tecnologia chamado "contêineres". Um contêiner Docker, ao contrário de uma máquina virtual, não requer nem inclui um sistema operacional separado. Em vez disso, ele depende da funcionalidade do kernel e usa isolamento de recursos (CPU, memória, E/S de bloco, rede, etc.) e espaços de nome separados para isolar a visão do aplicativo do sistema operacional, se tornando mais eficiente que a máquina virtual e ocupando menos espaço. Veja aqui como criar seu primeiro contâiner docker.

Dicas de uso: Docker

  1. Você pode se apoiar em containers prontos para criar seu próprio container. Acesse https://hub.docker.com/ e encontre vários exemplos a disposição.
  2. Não inclua dados no seu container docker.
  3. Como o Docker trabalha com toda a questão de redes através de iptables, qualquer alteração no seu firewall pode interromper o funcionamento de seu container Docker.

Curso de Pesquisa Reprodutível do Coursera: O curso foca em conceitos e ferramentas por trás de relatórios de análises de dados modernos de forma reprodutível.
Git Hub: Iniciando com Git Hub.
Bitbucket: Um passo a passo útil.
Jupyter Notebook: Um guia definitivo.
Docker: Comandos essenciais Docker.